<!--
+----------------------------------------------------------------------
| 友得云客  - 开启房产营销新纪元
+----------------------------------------------------------------------
| Copyright (c) 2019~2023 优得（西安）信息科技有限公司版权所有
+----------------------------------------------------------------------
| Licensed 友得云客不是自由软件 未经允许不可移除相关版权
+----------------------------------------------------------------------
| Author: www.youdeyunke.com
+----------------------------------------------------------------------
-->
<template>
    <div>
        <div style="display: flex;justify-content: space-between;border-bottom: 1px solid #dcdfe6;">

            <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch"
                label-width="68px">
                <el-form-item label="任务名称" prop="job_name">
                    <el-input v-model="queryParams.job_name" placeholder="请输入任务名称" clearable
                        @keyup.enter.native="handleQuery" />
                </el-form-item>
                <el-form-item label="任务组名" prop="job_group">
                    <el-select v-model="queryParams.job_group" placeholder="请选择任务组名" clearable>
                        <el-option v-for="dict in groupDict" :key="dict.value" :label="dict.label"
                            :value="dict.value" />
                    </el-select>
                </el-form-item>
                <el-form-item label="任务状态" prop="status">
                    <el-select v-model="queryParams.status" placeholder="请选择任务状态" clearable>
                        <el-option v-for="dict in statusDict" :key="dict.value" :label="dict.label"
                            :value="dict.value" />
                    </el-select>
                </el-form-item>
                <el-form-item>
                    <el-button type="primary" icon="el-icon-search" size="small" @click="handleQuery">搜索</el-button>
                    <el-button icon="el-icon-refresh" size="small" @click="resetQuery">重置</el-button>
                </el-form-item>
            </el-form>

            <div>
                <el-button type="primary" plain icon="el-icon-plus" size="small" @click="handleAdd">新增</el-button>
                <el-button type="danger" plain icon="el-icon-delete" size="small" :disabled="multiple"
                    @click="handleDelete">删除</el-button>
            </div>
        </div>
        <el-table v-loading="loading" :data="jobList" @selection-change="handleSelectionChange">
            <el-table-column type="selection" width="55" align="center" :selectable="selectable" />
            <el-table-column label="任务编号" width="100" align="center" prop="job_id" />
            <el-table-column label="任务名称" align="center" prop="job_name" :show-overflow-tooltip="true" />
            <el-table-column label="任务组名" align="center" prop="job_group">
                <template slot-scope="scope">
                    {{ scope.row.job_group ? statusData[(scope.row.job_group)].label : '默认' }}
                </template>
            </el-table-column>
            <el-table-column label="调用目标字符串" align="center" prop="invoke_target" :show-overflow-tooltip="true" />
            <el-table-column label="cron执行表达式" align="center" prop="cron_expression" :show-overflow-tooltip="true" />
            <el-table-column label="状态" align="center">
                <template slot-scope="scope">
                    <el-switch v-model="scope.row.status" active-value="0" inactive-value="1"
                        @change="handleStatusChange(scope.row)"></el-switch>
                </template>
            </el-table-column>
            <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
                <template slot-scope="scope">
                    <el-button size="mini" type="text" icon="el-icon-edit"
                        @click="handleUpdate(scope.row)">修改</el-button>
                    <el-button size="mini" type="text" icon="el-icon-delete" v-show="scope.row.can_delete"
                        @click="handleDelete(scope.row)">删除</el-button>
                </template>

            </el-table-column>
        </el-table>


        <!-- 添加或修改定时任务对话框 -->
        <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body :close-on-click-modal="false">
            <el-form ref="form" :model="form" :rules="rules" label-width="120px">
                <el-row>
                    <el-col :span="12">
                        <el-form-item label="任务名称" prop="job_name">
                            <el-input v-model="form.job_name" placeholder="请输入任务名称" />
                        </el-form-item>
                    </el-col>
                    <el-col :span="12">
                        <el-form-item label="任务分组" prop="job_group">
                            <el-select v-model="form.job_group" placeholder="请选择任务组名" clearable>
                                <el-option v-for="dict in groupDict" :key="dict.value" :label="dict.label"
                                    :value="dict.value" />
                            </el-select>
                        </el-form-item>

                    </el-col>
                    <el-col :span="24">
                        <el-form-item prop="invoke_target">
                            <span slot="label">
                                调用方法
                                <el-tooltip placement="top">
                                    <div slot="content">
                                        Bean调用示例：adminTask.ryParams('ry')
                                        <br />Class类调用示例：udeve.fang.quartz.task.AdminTask.ryParams('ry')
                                        <br />参数说明：支持字符串，布尔类型，长整型，浮点型，整型
                                    </div>
                                    <i class="el-icon-question"></i>
                                </el-tooltip>
                            </span>
                            <el-input v-model="form.invoke_target" placeholder="请输入调用目标字符串" />
                        </el-form-item>
                    </el-col>
                    <el-col :span="24">
                        <el-form-item label="cron表达式" prop="cron_expression">
                            <el-input v-model="form.cron_expression" placeholder="请输入cron执行表达式" />
                        </el-form-item>
                    </el-col>
                    <el-col :span="24">
                        <el-form-item label="执行策略" prop="misfire_policy">
                            <el-radio-group v-model="form.misfire_policy" size="mini">
                                <el-radio-button label="1">立即执行</el-radio-button>
                                <el-radio-button label="2">执行一次</el-radio-button>
                                <el-radio-button label="3">放弃执行</el-radio-button>
                            </el-radio-group>
                        </el-form-item>
                    </el-col>
                    <el-col :span="12">
                        <el-form-item label="是否并发" prop="concurrent">
                            <el-radio-group v-model="form.concurrent" size="mini">
                                <el-radio-button label="0">允许</el-radio-button>
                                <el-radio-button label="1">禁止</el-radio-button>
                            </el-radio-group>
                        </el-form-item>
                    </el-col>
                    <el-col :span="12">
                        <el-form-item label="状态">
                            <el-radio-group v-model="form.status" size="mini">
                                <el-radio-button label="0">正常</el-radio-button>
                                <el-radio-button label="1">暂停</el-radio-button>
                            </el-radio-group>
                        </el-form-item>
                    </el-col>
                </el-row>
            </el-form>
            <div slot="footer" class="dialog-footer">
                <el-button :loading="loading" :disabled="loading" @click="cancel" size="mini" icon="el-icon-close">取
                    消</el-button>
                <el-button :loading="loading" :disabled="loading" type="primary" size="mini" @click="submitForm"
                    icon="el-icon-check">确 定</el-button>

            </div>
        </el-dialog>

    </div>
</template>

<script>
import { listJob, getJob, delJob, addJob, updateJob, runJob, changeJobStatus } from "@/api/job";
import Crontab from '@/components/Crontab'

export default {
    components: { Crontab },
    name: "Job",
    data() {
        return {
            groupDict: [{
                value: 'DEFAULT',
                label: '默认'
            }, {
                value: 'SYSTEM',
                label: '系统'
            }],
            statusDict: [{
                value: '0',
                label: '正常'
            }, {
                value: '1',
                label: '暂停'
            }],
            statusData: {
                'DEFAULT': {
                    label: '默认'
                },
                'SYSTEM': {
                    label: '系统'
                }
            },
            // 遮罩层
            loading: true,
            // 选中数组
            ids: [],
            // 非单个禁用
            single: true,
            // 非多个禁用
            multiple: true,
            // 显示搜索条件
            showSearch: true,
            // 总条数
            total: 0,
            // 定时任务表格数据
            jobList: [],
            // 弹出层标题
            title: "",
            // 是否显示弹出层
            open: false,
            // 是否显示详细弹出层
            openView: false,
            // 是否显示Cron表达式弹出层
            openCron: false,
            // 传入的表达式
            expression: "",
            // 查询参数
            queryParams: {
                page: 1,
                per_page: 10,
                job_name: undefined,
                job_group: undefined,
                status: undefined
            },
            // 表单参数
            form: {},
            // 表单校验
            rules: {
                job_name: [
                    { required: true, message: "任务名称不能为空", trigger: "blur" }
                ],
                invoke_target: [
                    { required: true, message: "调用目标字符串不能为空", trigger: "blur" }
                ],
                cron_expression: [
                    { required: true, message: "cron执行表达式不能为空", trigger: "blur" }
                ]
            }
        };
    },
    created() {
        this.getList();
    },
    methods: {

        selectable(row, index) {
            return row.can_delete
        },

        // 多选框选中数据
        handleSelectionChange(selection) {
            this.tables = selection.map(item => item.tableName);
        },
        /** 查询定时任务列表 */
        getList() {
            this.loading = true;
            listJob(this.queryParams).then(response => {
                this.jobList = response.data.result;
                this.total = response.data.page;
                this.loading = false;
            });
        },
        // 取消按钮
        cancel() {
            this.open = false;
            this.reset();
        },
        resetForm(refName) {
            if (this.$refs[refName]) {
                this.$refs[refName].resetFields();
            }
        },
        // 表单重置
        reset() {
            this.form = {
                job_id: undefined,
                job_name: undefined,
                job_group: undefined,
                invoke_target: undefined,
                cron_expression: undefined,
                misfire_policy: 1,
                concurrent: 1,
                status: "0"
            };
            this.resetForm("form");
        },
        /** 搜索按钮操作 */
        handleQuery() {
            this.queryParams.page = 1;
            this.getList();
        },
        /** 重置按钮操作 */
        resetQuery() {
            this.resetForm("queryForm");
            this.handleQuery();
        },
        // 多选框选中数据
        handleSelectionChange(selection) {
            this.ids = selection.map(item => item.job_id);
            this.single = selection.length != 1;
            this.multiple = !selection.length;
        },
        // 任务状态修改
        handleStatusChange: function (row) {
            console.log(row);
            let text = row.status === "0" ? "启用" : "停用";
            this.$confirm('确认要"' + text + '""' + row.job_name + '"任务吗？', {
                confirmButtonText: "确定",
                cancelButtonText: "取消",
                type: "warning",
            }).then(() => {
                return changeJobStatus(row.job_id, row.status);
            }).then(() => {
                this.$message.success(text + "成功");
            }).catch(function () {
                row.status = row.status === "0" ? "1" : "0";
            });
        },
        /** cron表达式按钮操作 */
        handleShowCron() {
            this.expression = this.form.cron_expression;
            this.openCron = true;
        },
        /** 确定后回传值 */
        crontabFill(value) {
            this.form.cron_expression = value;
        },
        /** 新增按钮操作 */
        handleAdd() {
            this.reset();
            this.open = true;
            this.title = "添加任务";
        },
        /** 修改按钮操作 */
        handleUpdate(row) {
            this.reset();
            const jobId = row.job_id;
            getJob(jobId).then(response => {
                this.form = response.data;
                this.open = true;
                this.title = "修改任务";
            });
        },
        /** 提交按钮 */
        submitForm() {
            this.$refs["form"].validate(valid => {
                if (valid) {
                    this.loading = true;
                    if (this.form.job_id != undefined) {
                        updateJob(this.form).then(response => {
                            this.loading = false;
                            this.$message.success("修改成功");
                            this.open = false;
                            this.getList();
                        });
                    } else {
                        addJob(this.form).then(response => {
                            this.loading = false;
                            this.$message.success("新增成功");
                            this.open = false;
                            this.getList();
                        });
                    }
                }
            });
        },
        /** 删除按钮操作 */
        handleDelete(row) {
            console.log(row, "111111");
            const jobIds = row.job_id || this.ids;
            this.$confirm('是否确认删除定时任务编号为"' + jobIds + '"的数据项？', {
                confirmButtonText: "确定",
                cancelButtonText: "取消",
                type: "warning",
            }).then(function () {
                return delJob(jobIds);
            }).then(() => {
                this.getList();
                // this.$message.success("删除成功");
            }).catch(() => { });
        }
    }
};
</script>
